package com.example.stuwork.service.impl;

import com.example.stuwork.dao.ClassDao;
import com.example.stuwork.pojo.Class;
import com.example.stuwork.service.ClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 班级服务实现类
 */
@Service
public class ClassServiceImpl implements ClassService {

    @Autowired//IOC 注入
    private ClassDao classDao;

    /**
     * 获取所有班级
     *
     * @return 班级列表
     */
    @Override
    public List<Class> findAll() {
        return classDao.findAll();
    }

    /**
     * 根据班级ID获取班级信息
     *
     * @param classId 班级ID
     * @return 班级信息
     */
    @Override
    public Class getById(Long classId) {
        return classDao.getById(classId);
    }

    /**
     * 根据院系编号获取班级列表
     *
     * @param deptNumber 院系编号
     * @return 班级列表
     */
    @Override
    public List<Class> findByDeptNumber(String deptNumber) {
        return classDao.findByDeptNumber(deptNumber);
    }

    /**
     * 添加班级
     *
     * @param clazz 班级信息
     * @return 是否成功
     */
    @Override
    @Transactional
    public boolean addClass(Class clazz) {
        // 验证参数
        if (clazz == null) {
            return false;
        }
        
        // 验证必填字段
        if (clazz.getDeptNumber() == null || clazz.getGrade() == null || 
            clazz.getMajorCode() == null || clazz.getMajorName() == null || 
            clazz.getClassNumber() == null) {
            return false;
        }
        
        // 检查是否已存在
        if (existsClass(clazz.getDeptNumber(), clazz.getGrade(), 
                        clazz.getMajorCode(), clazz.getClassNumber())) {
            return false;
        }
        
        // 添加班级
        return classDao.insert(clazz) > 0;
    }

    /**
     * 更新班级信息
     *
     * @param clazz 班级信息
     * @return 是否成功
     */
    @Override
    @Transactional
    public boolean updateClass(Class clazz) {
        // 验证参数
        if (clazz == null || clazz.getClassId() == null) {
            return false;
        }
        
        // 验证班级是否存在
        Class existingClass = classDao.getById(clazz.getClassId());
        if (existingClass == null) {
            return false;
        }
        
        // 如果更新了关键字段，需要检查唯一性
        if (clazz.getDeptNumber() != null && clazz.getGrade() != null && 
            clazz.getMajorCode() != null && clazz.getClassNumber() != null) {
            
            // 检查是否与其他班级冲突（排除自身）
            if (!clazz.getDeptNumber().equals(existingClass.getDeptNumber()) ||
                !clazz.getGrade().equals(existingClass.getGrade()) ||
                !clazz.getMajorCode().equals(existingClass.getMajorCode()) ||
                !clazz.getClassNumber().equals(existingClass.getClassNumber())) {
                
                if (existsClass(clazz.getDeptNumber(), clazz.getGrade(), 
                                clazz.getMajorCode(), clazz.getClassNumber())) {
                    return false;
                }
            }
        }
        
        // 更新班级
        return classDao.update(clazz) > 0;
    }

    /**
     * 删除班级
     *
     * @param classId 班级ID
     * @return 是否成功
     */
    @Override
    @Transactional
    public boolean deleteClass(Long classId) {
        if (classId == null) {
            return false;
        }
        
        // 检查班级是否存在
        Class existingClass = classDao.getById(classId);
        if (existingClass == null) {
            return false;
        }
        
        // 删除班级
        return classDao.delete(classId) > 0;
    }

    /**
     * 检查班级是否存在
     *
     * @param deptNumber  院系编号
     * @param grade       年级
     * @param majorCode   专业编码
     * @param classNumber 班级号
     * @return 是否存在
     */
    @Override
    public boolean existsClass(String deptNumber, String grade, String majorCode, String classNumber) {
        if (deptNumber == null || grade == null || majorCode == null || classNumber == null) {
            return false;
        }
        
        return classDao.exists(deptNumber, grade, majorCode, classNumber);
    }

    /**
     * 根据关键字搜索班级
     *
     * @param keyword 关键字
     * @return 班级列表
     */
    @Override
    public List<Class> search(String keyword) {
        return classDao.search(keyword);
    }
} 